package com.cy;

import com.cy.pj.sys.service.realm.ShiroRealm;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition;
import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class DbpmsApplication {
    public static void main(String[] args) {
        SpringApplication.run(DbpmsApplication.class);
    }
    /**
     * 定义Realm对象,通过此对象访问数据库中的用户和权限信息,并进行封装.
     * @Bean 注解描述方法时,表示方法的返回要交给spring管理,这个bean的名字默认
     * 为方法名.还可以自己起名.例如@Bean("shiroRealm")
     * @return
     */
    @Bean
    public Realm realm(){
        return  new ShiroRealm();
    }




    /**
     * 基于此对象定义过滤规则,例如哪些请求必须要认证,哪些请求不需要认证
     * ShiroFilterChainDefinition此对象中定义了若干过滤器Filter,基于这
     * 些过滤器以及我们定义的过滤规则对业务进行实现.
     *
     * @return
     */
    @Bean
    public ShiroFilterChainDefinition shiroFilterChainDefinition(){
        //定义过滤链对象
        DefaultShiroFilterChainDefinition chainDefinition =
                new DefaultShiroFilterChainDefinition();
        //设置哪些资源需要认证才可访问
        //设置登录操作不需要认证(其中,anon表示匿名访问处理)
        //这里表示对url(例如/user/**),要调用过滤器链中的哪个过滤器(例如authc)进行处理,anon是匿名过滤器
        chainDefinition.addPathDefinition("/user/login/**","anon");


        //设置登出操作,登出以后要跳转到登录页面(其中,logout表示系统登出处理)
        chainDefinition.addPathDefinition("/user/logout","logout");
        //当我们访问一个需要认证以后 才可以访问的资源时,但是你还没有认证,此时会跳转登录页面
        chainDefinition.addPathDefinition("/**","user");

        return chainDefinition;
    }

    /**
     * 当将shiro中的注解RequiresPermissions放到控制层方法时需要配置此对象
     * 并指定对控制层方法上的注解有效(例如@GetMapping)
     * @return
     */
    @Bean
    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator(){
        DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator =
                new DefaultAdvisorAutoProxyCreator();
        advisorAutoProxyCreator.setUsePrefix(true);
        return advisorAutoProxyCreator;
    }

}
